//
//  SaxXMLHandler.m
//  UI15_XML_JSON数据结构解析
//
//  Created by Scott on 15/5/15.
//  Copyright (c) 2015年 www.lanou3g.com 蓝欧3G. All rights reserved.
//

#import "SaxXMLHandler.h"
#import "StudentModel.h"

@interface SaxXMLHandler ()

@property (nonatomic, retain) NSString *content;

@end

@implementation SaxXMLHandler


#pragma mark -  知识点2 SAX方式解析XML数据
/**
 * @brief 讲解:
 *
 * SAX: Simple API for XML. 基于事件驱动的解析方法, 逐行解析数据.(采用协议回调机制)
 *
 * NSXMLParse是iOS自带的XML解析类, 采用SAX方式解析数据.
 * 解析过程由NSXMLParseDelegate协议方法回调
 * 解析过程: 开始标签 -> 取值 -> 结束标签 -> 取值
 */


- (void)startSAXParse
{
    /* SAX 解析方式: 逐行解析xml文件 */
    /* 系统类: NSXMLParse */
    
    /* 获取文件路径, NSBundle:工程的文件包(所有的资源都在里面) */
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    
    /* 创建实例 */
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:filePath]];
    
    /* 签订协议, 指定代理人 */
    parser.delegate = self;
    
    /* 开始解析 */
    [parser parse];

    /* 创建 model 类 (数据模型) */
    
    /* 1. 确定数据模型: Student 
     * 2. 确定数据容器: 数组 */
    
}

#pragma mark ** NSXMLParse 协议方法(3个主要方法)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"%s", __FUNCTION__);
    /* 当元素名为students时, 即找到根节点的时候, 数组初始化 */
    if ([elementName isEqualToString:@"students"]) {
        self.arr = [NSMutableArray array];
        
        /* 当元素名为student时, 即找到student节点时, 创建一个student对象, 添加进数组中 */
    } else if ([elementName isEqualToString:@"student"]) {
        StudentModel *stu = [[StudentModel alloc] init];
        [self.arr addObject:stu];
        [stu release];
    }
    
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"%s", __FUNCTION__);
    /* 找到节点内容, 用属性接收一下数据内容, 下面的方法将用到内容 */
    self.content = string;
    
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"%s", __FUNCTION__);
    /* 到达节点尾 *1/
    
    /* 1. 找到要赋值的student对象 */
    StudentModel *stu = [self.arr lastObject];
    
    /* 2. 根据节点名, 给不同的属性赋值 */
    if ([elementName isEqualToString:@"name"]) {
        stu.name = self.content;
    } else if ([elementName isEqualToString:@"sex"]) {
        stu.sex = self.content;
    } else if ([elementName isEqualToString:@"number"]) {
        stu.number = self.content.integerValue;
    } else if ([elementName isEqualToString:@"age"]) {
        stu.age = self.content.integerValue;
    }
    
}



- (void)dealloc
{
    [_content release];
    [_arr release];
    [super dealloc];
}

@end
